/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Control;

import javax.swing.JTable;

/**
 *
 * @author FIDO-PORTA
 */
public class EstadisticaJ {
    //recibe los datos y los indices (alturas x celda)
    public Celda[][][] Policotomizacion(Celda[][][] Datos, JTable indice){
        int nColum = indice.getColumnCount();
        int nFilas = indice.getRowCount();
        int numerodeRegistros = 0;//contador que dice cuantos datos hay en una fila
        for(int i = 0; i < nFilas; i++){
            numerodeRegistros = 0;
            for(int j = 0; j < nColum; j++){//Guarda la cantidad de datos que hay en una fila (indices tiene el dato de la altura)
               numerodeRegistros += Integer.parseInt((String)indice.getValueAt(i, j));
            }
            //System.out.println("numero de registros: "+numerodeRegistros);
            //pasa los datos de ese bloque (fila) a un nuevo arreglo listaTemp
            Celda[] listaTemp = new Celda[numerodeRegistros];
            int count = 0;
            for(int j = 0; j < nColum; j++){
                String cadena = (String) indice.getValueAt(i, j); 
                int z = Integer.parseInt(cadena);
                //System.out.println("z: "+z);
                for(int k = 0; k < z; k++){
                    //System.out.println("contador: "+count+"Dato: "+Datos[i][j][k].getValor());
                    listaTemp[count]=Datos[i][j][k];//metiendo en lista temporal cada dato
                    count++;                   
                }
            }
            listaTemp = organizarLista(listaTemp);
            listaTemp = definirSerie(listaTemp);
            Datos = organizaSeries(Datos, listaTemp);
            
        }
        return Datos;
    }

    public Celda[] organizarLista(Celda[] lista) {
        int numeroRegistros = lista.length;
        Celda temp = new Celda();
        for(int i = 0 ; i < numeroRegistros; i++){
            for( int j = 0 ; j < numeroRegistros-1 ; j++){
                if ( lista[i].getValor() <  lista[j].getValor()) {
                    temp = lista[i];
                    lista[i] = lista[j];
                    lista[j] = temp;
                }
            }
        }
        return lista;
    }
    //Le da valor a la serie de cada dato
    public Celda[] definirSerie (Celda[] lista){
        int numeroRegistros = lista.length;
        int count = 1;
        lista[0].setSerie(count);
        for(int i = 1 ; i < numeroRegistros; i++){
            if (lista[i].getY() != lista[i-1].getY()){
                count++;
            }
            lista[i].setSerie(count);
        }
        return lista;
    }
    //asigna el valor de la serie a la matriz 3D en la posicion correspondiente
    public Celda[][][] organizaSeries(Celda[][][] datos, Celda[] lista){
        int numeroRegistros = lista.length;
        for(int i = 1 ; i < numeroRegistros; i++){
            datos[lista[i].getX()][lista[i].getY()][lista[i].getZ()]=lista[i];
        }
        return datos;
    }
    //DE AQUI EN ADELANTE SUMAS
    public int TotalRJ (int[][] sumaRCelda, int filas, int colum){
        int x = 0;
        for (int i=0; i < filas; i++){
            for (int j=0; j< colum; j++){
                x += sumaRCelda[i][j];
            }
        }
        return x;
    }
    
    public int calculoPorFila(Celda[][][] datos, int[][] indices, int fila , int nColum, int nFilas){
        int indiceInterno;
        int valor = 0;
        for (int i = 0 ; i < nColum ; i++){
            indiceInterno = indices[fila][i];
            for ( int j = 0 ; j < indiceInterno ; j++){
                valor += datos[fila][i][j].getSerie();
            }
        }
        return valor;
    }
    
    public int calculoPorColumna(Celda[][][] datos, int[][] indices, int columna , int nColum, int nFilas){
        int indiceInterno;
        int valor = 0;
//        System.out.println("calculoPorColumna: Filas "+nFilas);
        for (int i = 0 ; i < nFilas ; i++){
            indiceInterno = indices[i][columna];
            for ( int j = 0 ; j < indiceInterno ; j++){
                valor += datos[i][columna][j].getSerie();
            }
        }
        return valor;
    }
    
    public int[][] calculoPorCeldas(Celda[][][] datos, int[][] indices, int nColum, int nFilas){
        int[][] resultado = new int[nFilas][nColum];
        int ind;
        for(int i = 0 ; i < nFilas ; i++){
            for(int j = 0 ; j < nColum ; j++){
                ind = indices[i][j];
                for (int k = 0 ; k < ind ; k++){
                    resultado[i][j] +=  datos[i][j][k].getSerie();
                }
            }
        }
        return resultado;
    }
    
    
    public int productoFilas (int[] datos){
        int producto = 1;
        int length = datos.length;
        for (int i = 0 ; i < length ; i++){
            producto *= datos[i];
        }
        return producto;
    }
    
    public int TotalRJPotencia (int[][] sumaRCelda, int filas, int colum){
        int x = 0;
        for (int i=0; i < filas; i++){
            for (int j=0; j< colum; j++){
                x += Math.pow(sumaRCelda[i][j],2);
            }
        }
        return x;
    }
    
    
}
